import math
import numpy as np


# 设置坐标轴如何显示
def set_axis(ax, fig, plt, x_min, x_max, y_min, y_max, x_label, y_label):
    """
    设置坐标轴如何显示
    :param ax:
    :param fig:
    :param plt:
    :param x_min:
    :param x_max:
    :param y_min:
    :param y_max:
    :param x_label:
    :param y_label:
    :return:
    """

    ax.invert_yaxis()  # 颠倒y轴

    ax.xaxis.set_ticks_position('top')  # 将x轴刻度移至顶部
    ax.xaxis.set_label_position('top')  # 将x轴标签移至顶部

    ax.yaxis.set_ticks_position('left')

    ax.set_xlabel(x_label, fontsize=5)
    ax.set_ylabel(y_label, fontsize=5)

    # 调整 x 轴和 y 轴的刻度标签大小
    ax.tick_params(axis='x', labelsize=5)  # x 轴标签大小
    ax.tick_params(axis='y', labelsize=5)  # y 轴标签大小

    # 调整刻度线（tick marks）的长度和宽度
    ax.tick_params(axis='both', which='major', length=3, width=1)

    # 保证最大值和最小值能够显示
    x_ticks = np.arange(x_min, x_max, math.ceil((x_max - x_min) / 500) * 100)
    x_ticks = np.append(x_ticks, x_max)
    y_ticks = np.arange(y_min, y_max, math.ceil((y_max - y_min) / 2500) * 100)
    y_ticks = np.append(y_ticks, y_max)
    if y_ticks[-1] - y_ticks[-2] < (y_max - y_min) / 25:
        y_ticks[-2] = y_ticks[-1]
        y_ticks = y_ticks[:-1]
    ax.set_yticks(x_ticks)
    ax.set_yticks(y_ticks[::-1])  # 因为y轴颠倒，所以要反过来设置

    # 保证刻度线能正常显示，需要放到最后面设置
    plt.xlim(x_min, x_max)  # 因为y轴颠倒，所以要反过来设置
    plt.ylim(y_max, y_min)  # 因为y轴颠倒，所以要反过来设置

    # 确保刻度标签显示为整数
    # ax.xaxis.set_major_formatter('{x:.0f}')  # 格式化器确保显示整数
    # ax.yaxis.set_major_formatter('{x:.0f}')

    # 解决放大图像后坐标轴不更新的问题
    def on_zoom(event):
        # 仅在缩放操作后执行（鼠标释放事件）
        if event.name == 'button_release_event':
            ax.relim()  # 重新计算数据边界
            ax.autoscale_view()  # 自动调整坐标轴范围
            fig.canvas.draw_idle()  # 重绘图形

    # 连接事件处理函数
    fig.canvas.mpl_connect('button_release_event', on_zoom)


# 显示plt，同时设置图例
def set_legend(my_plt):
    """
    显示plt，同时设置图例
    :param my_plt: plt
    :return:
    """
    # 设置图例样式和位置
    my_plt.legend(
        fontsize=5,  # 字体大小
        frameon=False,  # 显示边框
        framealpha=0.5,  # 边框透明度
        loc='upper right',  # 自动选择最佳位置
        markerscale=1.5,  # 放大图例中的标记
        # title='函数图例'  # 图例标题
    )